タスク数を 0 に変更してもオートスケーリングのスケールアウトが実行される挙動を回避するためには
困っていた内容
ターゲット追跡スケーリングポリシーを設定したオートスケーリングを ECS サービスに設定しています。
手動で ECS サービスのタスク数(必要数)を0
に変更しましたが、その後スケールアウトが実施されました。
オートスケーリングの「タスクの最小数」も「0」に設定していて、ターゲットのメトリクス値も低いので、スケールアウトは実行されない認識ですが、なぜタスク数が更新されたのでしょうか。
スケールアウトを回避する方法があれば併せて教えてください。
どう対応すればいいの?
スケーリングの一時停止をご利用ください。
ターゲット追跡スケーリングポリシーは、過去のメトリクス状況を含めてタスク数を調整するため、過去のリソース状況を参照し、意図しないスケーリング(タスク数の変更)が行われる場合があります。
例えば、一定の負荷があるサービスのタスク数を0
に手動変更した直後は、過去のメトリクス状況から必要なタスク数が計算され、スケールアウトされる場合があります。
参照される過去の期間の変更はサポートされていませんが、スケーリングの一時的な停止はサポートされています。
そのため、スケールアウトを回避したい場合は、スケーリングの一時停止をご利用ください。
なお、スケールアウトが発生した場合も、一定時間経過し、メトリクスからタスク数は0
が適切と判断されれば、自動的にスケールインの実施が期待されます。
スケールアウトの一時停止をやってみた
describe-scalable-targetsコマンドで、現在の設定状況とresource-id
を確認します。
$ aws application-autoscaling describe-scalable-targets --service-namespace ecs { "ScalableTargets": [ { "ServiceNamespace": "ecs", "ResourceId": "service/hato-cluster/hato-service", "ScalableDimension": "ecs:service:DesiredCount", "MinCapacity": 0, "MaxCapacity": 2, "RoleARN": "arn:aws:iam::123456789012:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService", "CreationTime": "2023-01-01T01:01:01.008000+09:00", "SuspendedState": { "DynamicScalingInSuspended": false, "DynamicScalingOutSuspended": false, "ScheduledScalingSuspended": false } } ] }
register-scalable-targetコマンドでDynamicScalingOutSuspended=true
(スケールアウトを一時停止)を設定します。
$ aws application-autoscaling register-scalable-target \ --service-namespace ecs \ --scalable-dimension "ecs:service:DesiredCount" \ --resource-id "【resource-idの値】" \ --suspended-state DynamicScalingOutSuspended=true
describe-scalable-targetsコマンドで設定された設定値を確認します。
$ aws application-autoscaling describe-scalable-targets --service-namespace ecs { "ScalableTargets": [ { "ServiceNamespace": "ecs", "ResourceId": "service/hato-cluster/hato-service", "ScalableDimension": "ecs:service:DesiredCount", "MinCapacity": 0, "MaxCapacity": 2, "RoleARN": "arn:aws:iam::123456789012:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService", "CreationTime": "2023-01-01T01:01:01.008000+09:00", "SuspendedState": { "DynamicScalingInSuspended": false, "DynamicScalingOutSuspended": true, "ScheduledScalingSuspended": false } } ] }
スケールアウトの一時停止を解除する場合
register-scalable-targetコマンドでDynamicScalingOutSuspended=false
を設定します。
$ aws application-autoscaling register-scalable-target \ --service-namespace ecs \ --scalable-dimension "ecs:service:DesiredCount" \ --resource-id "【resource-idの値】" \ --suspended-state DynamicScalingOutSuspended=false